package cn.dansj.common.utils.json;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

class NumberDeserializer extends JsonDeserializer<Object> {
    public static final NumberDeserializer INSTANCE = new NumberDeserializer();

    @Override
    public Object deserialize(JsonParser p, DeserializationContext context) throws IOException {
        boolean writeNumbersAsStrings = context.isEnabled(NumericFeature.USE_STRING_FOR_NUMERIC);

        JsonToken token = p.getCurrentToken();
        // 处理数字
        if (token == JsonToken.VALUE_NUMBER_INT || token == JsonToken.VALUE_NUMBER_FLOAT) {
            if (writeNumbersAsStrings) {
                return p.getText(); // 数字 -> 字符串
            } else {
                return p.getNumberValue(); // 保持数字
            }
        }
        // 处理字符串
        else if (token == JsonToken.VALUE_STRING) {
            return p.getText();
        }
        // 处理布尔值
        else if (token == JsonToken.VALUE_TRUE || token == JsonToken.VALUE_FALSE) {
            return p.getBooleanValue();
        }
        // 处理数组（List）
        else if (token == JsonToken.START_ARRAY) {
            List<Object> list = new ArrayList<>();
            while (p.nextToken() != JsonToken.END_ARRAY) {
                list.add(deserialize(p, context)); // 递归处理数组元素
            }
            return list;
        }
        // 处理对象（Map）
        else if (token == JsonToken.START_OBJECT) {
            Map<String, Object> map = new HashMap<>();
            while (p.nextToken() != JsonToken.END_OBJECT) {
                String fieldName = p.currentName();
                p.nextToken(); // 移动到值
                map.put(fieldName, deserialize(p, context)); // 递归处理对象值
            }
            return map;
        }
        // 处理 null
        else if (token == JsonToken.VALUE_NULL) {
            return null;
        } else if (token == JsonToken.VALUE_ENUM) {
            return p.getObject();
        }
        // 其他情况（理论上不会进入）
        throw new UnsupportedOperationException("Unsupported token: " + token);
    }
}
